import { assign } from 'min-dash'

/**
 * A palette provider for BPMN 2.0 elements.
 */
export default function PaletteProvider(palette, create, elementFactory, spaceTool, lassoTool, handTool, globalConnect, translate) {
  this._palette = palette
  this._create = create
  this._elementFactory = elementFactory
  this._spaceTool = spaceTool
  this._lassoTool = lassoTool
  this._handTool = handTool
  this._globalConnect = globalConnect
  this._translate = translate

  palette.registerProvider(this)
}

PaletteProvider.$inject = ['palette', 'create', 'elementFactory', 'spaceTool', 'lassoTool', 'handTool', 'globalConnect', 'translate']

PaletteProvider.prototype.getPaletteEntries = function() {
  const actions = {},
    create = this._create,
    elementFactory = this._elementFactory,
    spaceTool = this._spaceTool,
    lassoTool = this._lassoTool,
    handTool = this._handTool,
    globalConnect = this._globalConnect,
    translate = this._translate

  function createAction(type, group, className, title, options) {
    function createListener(event) {
      const shape = elementFactory.createShape(assign({ type: type }, options))

      if (options) {
        shape.businessObject.di.isExpanded = options.isExpanded
      }

      create.start(event, shape)
    }

    const shortType = type.replace(/^bpmn:/, '')

    return {
      group: group,
      className: className,
      title: title || translate('Create {type}', { type: shortType }),
      action: {
        dragstart: createListener,
        click: createListener
      }
    }
  }

  function createSubprocess(event) {
    const subProcess = elementFactory.createShape({
      type: 'bpmn:SubProcess',
      x: 0,
      y: 0,
      isExpanded: true
    })

    const startEvent = elementFactory.createShape({
      type: 'bpmn:StartEvent',
      x: 40,
      y: 82,
      parent: subProcess
    })

    create.start(event, [subProcess, startEvent], {
      hints: {
        autoSelect: [startEvent]
      }
    })
  }

  function createParticipant(event) {
    create.start(event, elementFactory.createParticipantShape())
  }

  assign(actions, {
    // "hand-tool": {
    //   group: "tools",
    //   className: "bpmn-icon-hand-tool",
    //   title: translate("Activate the hand tool"),
    //   action: {
    //     click: function(event) {
    //       handTool.activateHand(event);
    //     }
    //   }
    // },
    // "lasso-tool": {
    //   group: "tools",
    //   className: "bpmn-icon-lasso-tool",
    //   title: translate("Activate the lasso tool"),
    //   action: {
    //     click: function(event) {
    //       lassoTool.activateSelection(event);
    //     }
    //   }
    // },
    // "space-tool": {
    //   group: "tools",
    //   className: "bpmn-icon-space-tool",
    //   title: translate("Activate the create/remove space tool"),
    //   action: {
    //     click: function(event) {
    //       spaceTool.activateSelection(event);
    //     }
    //   }
    // },
    // "global-connect-tool": {
    //   group: "tools",
    //   className: "bpmn-icon-connection-multi",
    //   title: translate("Activate the global connect tool"),
    //   action: {
    //     click: function(event) {
    //       globalConnect.toggle(event);
    //     }
    //   }
    // },
    // "tool-separator": {
    //   group: "tools",
    //   separator: true
    // },
    'create.start-event': createAction('bpmn:StartEvent', 'event', 'bpmn-icon-start-event-none', translate('Create StartEvent')),
    // "create.intermediate-event": createAction(
    //   "bpmn:IntermediateThrowEvent",
    //   "event",
    //   "bpmn-icon-intermediate-event-none",
    //   translate("Create Intermediate/Boundary Event")
    // ),
    'create.end-event': createAction('bpmn:EndEvent', 'event', 'bpmn-icon-end-event-none', translate('Create EndEvent')),
    'create.exclusive-gateway': createAction('bpmn:ExclusiveGateway', 'gateway', 'bpmn-icon-gateway-none', translate('Create Gateway')),
    'create.user-task': createAction('bpmn:UserTask', 'activity', 'bpmn-icon-user-task', translate('Create User Task'))
    // "create.data-object": createAction("bpmn:DataObjectReference", "data-object", "bpmn-icon-data-object", translate("Create DataObjectReference")),
    // "create.data-store": createAction("bpmn:DataStoreReference", "data-store", "bpmn-icon-data-store", translate("Create DataStoreReference")),
    // "create.subprocess-expanded": {
    //   group: "activity",
    //   className: "bpmn-icon-subprocess-expanded",
    //   title: translate("Create expanded SubProcess"),
    //   action: {
    //     dragstart: createSubprocess,
    //     click: createSubprocess
    //   }
    // },
    // "create.participant-expanded": {
    //   group: "collaboration",
    //   className: "bpmn-icon-participant",
    //   title: translate("Create Pool/Participant"),
    //   action: {
    //     dragstart: createParticipant,
    //     click: createParticipant
    //   }
    // },
    // "create.group": createAction("bpmn:Group", "artifact", "bpmn-icon-group", translate("Create Group"))
  })

  return actions
}
